import { Controller, Get, Query, Param, ParseIntPipe, Post, Body, Render, Response, Request } from '@nestjs/common';
import { UserService } from './user.service';
import { LogService } from '../log/log.service';

@Controller('user')
export class UserController {
  constructor (
    private readonly userService: UserService,
    private readonly logService: LogService,
  ) { }

  /**
   * @Get([path])当前的path会拼接到@Controller('user')到里面user的路径后面，不写就表示为空的
   */
  @Get()
  // userList这个方法名随便自己定义,要见文思意就可以
  async userList(
    @Query() query: any, // 获取全部query参数
    @Query('name') name: string // 获取一个参数
  ): Promise<any[]> {
    // 控制层访问服务层的userList方法
    this.logService.log('运行了userList控制器');
    this.logService.log(JSON.stringify(query));
    this.logService.log('name: ' + name);
    // 控制层访问服务层的userList方法
    return await this.userService.userList();
  }

  // 带参数的路由 /user/:id
  // @Get(":id")
  // userInfo(
  //   @Param() params: any, // 获取全部 params
  //   @Param('id', new ParseIntPipe()) id: number // 获取单个参数
  // ) {
  //   console.log('params: ' + JSON.stringify(params)); // 输出{ id: '2' }
  //   return "用户详情" + id
  // }

  @Post()
  addUser(
    @Body() body: any // 接收全部body
  ) {
    // 这种写法适合大规模的提交参数,自己又不想一个一个去校验
    console.log(body);
    return body
  }

  @Get('login')
  @Render('login') // 渲染views里面的ejs模板
  loginPage(@Request() req: { [key: string]: any }): any {
    req.session.name = 'session name'
    // session销毁 1. 设置过期时间， 2. 将值设置为空 3. req.session.destroy((err) => {})
    // req.session.cookie.maxAge = 0
    // 这里的数据到时候讲到数据库，服务层的时候直接从数据库拉取数据,现在先写个假数据
    return { title: '登录页面' } // 返回给ejs模板的数据
  }

  @Post('login')
  login(@Body() body, @Response() res) {
    res.cookie('name', 'hello', { maxAge: 1000 * 5, httpOnly: true });
    res.cookie('signed', 'signed', { httpOnly: true, signed: true })
    console.log(body); // 获取表单中提交的数据
    res.redirect('/'); // 重定向到首页
    // 注意如果在控制器函数中使用了@Response()就不能使用return返回值
  }
}
